<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="mL7VR" id="mL7VR"><span data-lake-id="u67d671d2" id="u67d671d2">典型回答</span></h1>
  <p data-lake-id="ub23b03da" id="ub23b03da"><br></p>
  <p data-lake-id="uea621304" id="uea621304"><span data-lake-id="ud1e8069d" id="ud1e8069d">都说TCP是提供可靠传输的，那么这个可靠怎么理解呢？</span></p>
  <p data-lake-id="u3d8021c2" id="u3d8021c2"><span data-lake-id="u87d83e50" id="u87d83e50">​</span><br></p>
  <p data-lake-id="uabdc4ea9" id="uabdc4ea9"><span data-lake-id="u27cf4a3a" id="u27cf4a3a">我觉得描述一个网络协议可靠，至少要满足以下几点：</span></p>
  <p data-lake-id="u32e56029" id="u32e56029"><span data-lake-id="ue2a32684" id="ue2a32684">​</span><br></p>
  <p data-lake-id="u92ed1263" id="u92ed1263"><span data-lake-id="u6bbd0e04" id="u6bbd0e04">1、数据完整性，我传给你的是123，你收到的也得是123，不能是13</span></p>
  <p data-lake-id="uf89040a5" id="uf89040a5"><span data-lake-id="ub776d917" id="ub776d917">2、数据顺序，我是按照123给你的，你不能按照213收到。</span></p>
  <p data-lake-id="u66c3df3e" id="u66c3df3e"><span data-lake-id="ufa5a96e2" id="ufa5a96e2">3、不能重复，我传给你的是123，你不能给我接收成1223</span></p>
  <p data-lake-id="ue81ed412" id="ue81ed412"><span data-lake-id="u5e2188ab" id="u5e2188ab">4、不被篡改，我传给你的是123，你不能接收成12`3</span></p>
  <p data-lake-id="u1f78c141" id="u1f78c141"><span data-lake-id="ua910f2ae" id="ua910f2ae">​</span><br></p>
  <p data-lake-id="u42234283" id="u42234283"><span data-lake-id="u761d7e92" id="u761d7e92">所以，要保证以上几点，TCP主要做了以下几个事情：</span></p>
  <p data-lake-id="u78ed763e" id="u78ed763e"><br></p>
  <p data-lake-id="ub40cd883" id="ub40cd883"><span data-lake-id="u8faaedf7" id="u8faaedf7">应用数据被分割成 TCP 认为最适合发送的数据块。TCP 给发送的每一个包进行编号，接收方对数据包进行排序，把有序数据传送给应用层。</span></p>
  <p data-lake-id="u9f776ee6" id="u9f776ee6"><span data-lake-id="u5c203a08" id="u5c203a08">​</span><br></p>
  <p data-lake-id="u4ff2cd0f" id="u4ff2cd0f"><strong><span data-lake-id="u708640d4" id="u708640d4">校验和</span></strong><span data-lake-id="u169cbc0b" id="u169cbc0b">： TCP 将保持它首部和数据的检验和。这是一个端到端的检验和，目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错，TCP 将丢弃这个报文段和不确认收到此报文段。</span></p>
  <p data-lake-id="udc70b22f" id="udc70b22f"><span data-lake-id="u4ef908c7" id="u4ef908c7">​</span><br></p>
  <p data-lake-id="u8ac2cc04" id="u8ac2cc04"><strong><span data-lake-id="u76b34312" id="u76b34312">三次握手&amp;四次挥手</span></strong><span data-lake-id="u2b86b3e2" id="u2b86b3e2">：TCP通过三次握手建立连接和四次挥手关闭连接，确保通信的可靠性和数据的可靠传输。</span></p>
  <p data-lake-id="u9c8e07eb" id="u9c8e07eb"><br></p>
  <p data-lake-id="ud9d60d5b" id="ud9d60d5b"><strong><span data-lake-id="uce93ef4a" id="uce93ef4a">流量控制</span></strong><span data-lake-id="u487b338f" id="u487b338f">： TCP 连接的每一方都有固定大小的缓冲空间，TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据，能提示发送方降低发送的速率，防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 （TCP 利用滑动窗口实现流量控制）</span></p>
  <p data-lake-id="u4235e8f0" id="u4235e8f0"><span data-lake-id="ub6f7caa9" id="ub6f7caa9">​</span><br></p>
  <p data-lake-id="ue071ea90" id="ue071ea90"><strong><span data-lake-id="u1fd57186" id="u1fd57186">拥塞控制</span></strong><span data-lake-id="u15e93a8b" id="u15e93a8b">： TCP使用拥塞控制算法来确保网络中没有过多的数据导致拥塞。当网络拥塞时，发送端会减少发送速率，以避免进一步加重网络拥塞。常用的拥塞控制算法包括慢启动、拥塞避免和快速重传等。</span></p>
  <p data-lake-id="uc87dcf85" id="uc87dcf85"><span data-lake-id="u4faed876" id="u4faed876">​</span><br></p>
  <p data-lake-id="u441ab876" id="u441ab876"><strong><span data-lake-id="u655efa6d" id="u655efa6d">ARQ协议</span></strong><span data-lake-id="udc7b7809" id="udc7b7809">： 也是为了实现可靠传输的，它的基本原理就是每发完一个分组就停止发送，等待对方确认。在收到确认后再发下一个分组。</span></p>
  <p data-lake-id="ud1a95a93" id="ud1a95a93"><span data-lake-id="u47cce880" id="u47cce880">​</span><br></p>
  <p data-lake-id="ue81b3edb" id="ue81b3edb"><strong><span data-lake-id="ueb9bc8f1" id="ueb9bc8f1">超时重传</span></strong><span data-lake-id="u7ca8f2e6" id="u7ca8f2e6">： 当 TCP 发出一个段后，它启动一个定时器，等待目的端确认收到这个报文段。如果不能及时收到一个确认，将重发这个报文段。</span></p>
  <p data-lake-id="ub0bda07b" id="ub0bda07b"><span data-lake-id="u44fcb3dd" id="u44fcb3dd">​</span><br></p>
 </body>
</html>